// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package poll

import (
	"syscall"
	_ "unsafe" // for go:linkname 
)

// OpenDir返回一个指向适合于
// ReadDir的DIR结构的指针。如果出现错误，将返回失败的
// syscall的名称以及syscall.Errno。
func (fd *FD) OpenDir() (uintptr, string, error) {
	// fdopendir（3）控制文件描述符，
	// 因此使用dup。
	fd2, call, err := fd.Dup()
	if err != nil {
		return 0, call, err
	}
	var dir uintptr
	for {
		dir, err = fdopendir(fd2)
		if err != syscall.EINTR {
			break
		}
	}
	if err != nil {
		syscall.Close(fd2)
		return 0, "fdopendir", err
	}
	return dir, "", nil
}

// 在syscall/syscall_darwin.go中实现。
// go:linkname fdopendir syscall.fdopendir 
func fdopendir(fd int) (dir uintptr, err error)
